// function maxSubStr(str) {
//     let arr = []; // 缓存当前不重复的子串
//     let num = 0; // 缓存当前最长子串的长度
//     let curStr = ""; // 保存当前最长子串
//     for (let i = 0; i < str.length; i++) {
//         if (arr.indexOf(str[i]) === -1) {
//             arr.push(str[i]);
//         } else {
//             let cur = arr.indexOf(str[i]);
//             // 根之前的子串做比较
//             // 缓存最大的子串
//             if (num < arr.length) {
//                 num = arr.length;
//                 curStr = arr.join(""); // 永远只保存最大的子串
//             }
//             // 把重复子串的前面字符都删掉，
//             arr.splice(0, cur + 1);
//             arr.push(str[i]);
//         }
//     }
//     // 为了解决最后一个字符串不一定是重复字符，
//     if (num < arr.length) {
//         num = arr.length;
//         curStr = arr.join("");
//     }
//     console.log("最长不重复子串-----》", curStr, arr, num);
//     return curStr;
// }

// maxSubStr("abcabcbbabcdefj");
// // function a(arr) {
// //     let left = [];
// //     let right = []
// //     let mid = arr[0];
// //     for (let i = 1; i < arr.length; i++) {
// //         if (arr[i] > mid) {
// //             right.push(arr[i])
// //         } else {
// //             left.push(arr[i])
// //         }
// //     }
// //     return [...a(left), mid, ...a(right)]
// // }

/**
 * 给定一个字符串 s ，请你找出其中不含有重复字符的 最长子串 的长度。
 */

function lengthOfSubStr(str) {
    if (!str.length) return 0;
    let map = new Map();
    let max = 0;
    let left = 0;
    let i = 0;
    // abcabcbb
    /**
     * [
     *  ['a', 3],
     *  ['b', 4],
     *  ['c', 5],
     *  left = 3,
     *  max = 3,
     * ]
     */
    while (i < str.length) {
        if (map.has(str[i])) {
            let idx = map.get(str[i]) + 1;
            left = Math.max(left, idx);
        }
        map.set(str[i], i);
        max = Math.max(max, i - left + 1);
        i++;
    }
    return max;
}
/**
 * 使用队列
 * @param {*} str 
 * @returns 
 */
function lengthOfLongestSubstring(str) {
    let ln = 0;
    let queue = [];
    for (let i = 0; i < str.length; i++) {
        if (queue.indexOf(str[i]) >= 0) {
            ln = Math.max(ln, queue.length);
            let k = queue.indexOf(str[i]);
            while (k >= 0) {
                queue.shift();
                k--;
            }
        }
        queue.push(str[i]);
    }
    return Math.max(ln, queue.length);
}

console.log(lengthOfSubStr("abcabcbb"));